/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ivanbiz.service;

import com.ivanbiz.dao.GLAccountDAO;
import com.ivanbiz.dao.InvoiceDAO;
import com.ivanbiz.dao.PembayaranDAO;
import com.ivanbiz.dao.impl.GLAccountDAOImpl;
import com.ivanbiz.dao.impl.InvoiceDAOImpl;
import com.ivanbiz.dao.impl.PembayaranDAOImpl;
import com.ivanbiz.model.GLAccount;
import com.ivanbiz.model.Invoice;
import com.ivanbiz.model.Pembayaran;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.zkoss.zul.Textbox;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.select.SelectorComposer;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;

/**
 *
 * @author IW20149X
 */
public class PembayaranTagihanActionService extends SelectorComposer<Component> {

    InvoiceDAO invoiceDAO;
    GLAccountDAO gLAccountDAO;
    @Wire
    Combobox listInvoice;
    @Wire
    Datebox datePosting;
    @Wire
    Textbox debitur;
    @Wire
    Textbox kreditur;
    @Wire
    Textbox jumlah;
    @Wire
    Textbox deskripsi;
    @Wire
    Checkbox checkPajak;
    @Wire
    Textbox biayaPajak;
    @Wire
    Window winPembayaranTagihanAction;
    Pembayaran pembayaran;
    GLAccount glDebitur;
    GLAccount glKreditur;
    PembayaranDAO pembayaranDAO;

    @Override
    public void doAfterCompose(Component comp) throws Exception {
        super.doAfterCompose(comp);
        pembayaranDAO = new PembayaranDAOImpl();
        invoiceDAO = new InvoiceDAOImpl();
        gLAccountDAO = new GLAccountDAOImpl();
        loadInvoice();
        pembayaran = (Pembayaran) Executions.getCurrent().getArg().get("pembayaran");
        if (pembayaran != null) {
            renderUbahNoInvoice();
            debitur.setValue(pembayaran.getDebitBankAccount().getNameGL() + " A/C No. " + pembayaran.getDebitBankAccount().getNoGL());
            glDebitur = pembayaran.getDebitBankAccount();
            kreditur.setText(pembayaran.getKreditBankAccount().getNameGL() + " A/C No. " + pembayaran.getKreditBankAccount().getNoGL());
            glKreditur = pembayaran.getKreditBankAccount();
        }
    }

    private void loadInvoice() {
        try {
            List<Invoice> loadInvoice = invoiceDAO.getDataByEquals("1");
            for (Invoice invoice : loadInvoice) {
                Comboitem item = new Comboitem();
                item.setValue(invoice);
                item.setLabel(invoice.getNII());
                listInvoice.appendChild(item);
            }
        } catch (Exception ex) {
            Logger.getLogger(PembayaranTagihanActionService.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Listen("onSelect=#listInvoice;")
    public void pilihInvoice() {
        try {
            Invoice invoice = listInvoice.getSelectedItem().getValue();
            String[] kepada = invoice.getDeskripsiKepada().split("#");
            glDebitur = (GLAccount) gLAccountDAO.getDataByEqual(GLAccount.class, "noGL", kepada[0]);
            debitur.setValue(glDebitur.getNameGL() + " A/C No. " + glDebitur.getNoGL());
            String[] untuk = invoice.getDeskripsiUntuk().split("#");
            glKreditur = (GLAccount) gLAccountDAO.getDataByEqual(GLAccount.class, "noGL", untuk[0]);
            kreditur.setValue(untuk[1] + " A/C No. " + untuk[0]);
            jumlah.setValue(String.valueOf(new Double(invoice.getJumlahTagihan()).intValue()));
            deskripsi.setValue(invoice.getDeskripsiUntukPembayaran() + "\n" + "dengan peserta sebanyak " + invoice.getDeskripsiJumlahPeserta() + " orang");
        } catch (Exception ex) {
            Logger.getLogger(PembayaranTagihanActionService.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Listen("onClick=#simpan;")
    public void simpan() {
        if (pembayaran == null) {
            pembayaran = new Pembayaran();
        }
        pembayaran.setDateCreated(new Date());
        pembayaran.setStatus("0");
        pembayaran.setDatePosting(datePosting.getValue());
        pembayaran.setInvoice((Invoice) listInvoice.getSelectedItem().getValue());
        pembayaran.setTransactionReference(pembayaran.getInvoice().getNII());
        pembayaran.setDebitBankAccount(glDebitur);
        pembayaran.setKreditBankAccount(glKreditur);
        pembayaran.setJumlah(jumlah.getValue().isEmpty() ? (double) 0 : new Double(jumlah.getValue()));
        pembayaran.setDeskripsi(deskripsi.getValue());
        pembayaran.setPathImage("");
        pembayaran.setStatusPajak(biayaPajak.getValue().isEmpty() ? "0" : "1");
        pembayaran.setBiayaPajak(biayaPajak.getValue().isEmpty() ? (double) 0 : new Double(biayaPajak.getValue()));
        validate(pembayaran);
    }

    private void validate(Pembayaran pembayaran) {
        if (pembayaran.getDatePosting() == null) {
            Messagebox.show("Date tidak boleh kosong");
        } else if (pembayaran.getInvoice() == null) {
            Messagebox.show("Invoice tidak boleh null");
        } else if (pembayaran.getDebitBankAccount() == null) {
            Messagebox.show("Debitur tidak boleh kosong");
        } else if (pembayaran.getKreditBankAccount() == null) {
            Messagebox.show("Kreditur tidak boleh null");
        } else if (pembayaran.getJumlah() == (double) 0) {
            Messagebox.show("Jumlah tidak boleh kosong");
        } else if (pembayaran.getDeskripsi().trim().isEmpty()) {
            Messagebox.show("Deskripsi tidak boleh kosong");
        } else {
            try {
                pembayaranDAO.saveOrUpdate(pembayaran);
                winPembayaranTagihanAction.detach();
            } catch (Exception ex) {
                Logger.getLogger(PembayaranTagihanActionService.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    private void renderUbahNoInvoice() {
        try {
            List<Invoice> loadInvoice = invoiceDAO.getDataByEquals("1");
            loadInvoice.add(0, pembayaran.getInvoice());
            for (Invoice invoice : loadInvoice) {
                Comboitem item = new Comboitem();
                item.setValue(invoice);
                item.setLabel(invoice.getNII());
                listInvoice.appendChild(item);
            }
        } catch (Exception ex) {
            Logger.getLogger(PembayaranTagihanActionService.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
